package ball;

import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import barrier.Barrier;
import util.Contents;
/*
 * 球类，记录当前及下一时刻球的速度、方向，并进行移动
 * 作为主动体 对
 */
public class Ball extends Barrier {

	private double vx;	// x方向的速度
	private double vy;	// y方向的速度
	private double ax;	// x方向的加速度
	private double ay;	// y方向的加速度
	private double maxVx;	// x方向的最大速度
	private double maxVy;	// x方向的最大速度
	//球在下一时刻的坐标
	private double nextX;
	private double nextY;
	//球的边缘位置
	private double nextEx;
	private double nextEy;

	private boolean haveBall;	//球是否存在 若被黑洞吞噬则为False

	public Ball(int x, int y, int size) {
		super(1, "Ball", x, y, 1, 1, size);	// 调用上级函数设置位置参数
		this.vx = Contents.BALL_INITIAL_VX;
		this.vy = Contents.BALL_INITIAL_VY;
		this.ax = Contents.BALL_INITIAL_AX;
		this.ay = Contents.BALL_INITIAL_AY;
		this.maxVx = Contents.BALL_INITIAL_MAXVX;
		this.maxVy = Contents.BALL_INITIAL_MAXVY;
		haveBall = true;

		// 常数初始化球各项参数

		changeNextPosition();	// 初始化NextX，NextY
		try {
			this.img = ImageIO.read(new File(Contents.BALL_IMG_PATH));
		} catch (IOException e) {
			System.out.println("BALL_IMG read error");
		}
		// 初始化球的图片
	}

	// 设置球在x轴上的速度
	public void setVx(double vx) {
		this.vx = vx;
	}

	// 设置球在y轴上的速度
	public void setVy(double vy) {
		this.vy = vy;
	}

	// 设置球在x轴上的加速度
	public void setAx(double ax) {
		this.ax = ax;
	}

	// 设置球在y轴上的加速度
	public void setAy(double ay) {
		this.ay = ay;
	}

	//球在单位时间内移动一次
	public void move() {
		x = nextX;
		y = nextY;
		ex = nextEx;
		ey = nextEy;
		changeNextPosition();
		changeVx();
		changeVy();
	}

	//改变球在x方向上的速度
	public void changeVx() {
		vx += Contents.DT * ax;
		correctV();
	}

	//改变球在y方向上的速度
	public void changeVy() {
		vy += Contents.DT * ay;
		correctV();
	}

	//修正球的速度
	public void correctV() {
		if (vx > maxVx)
			vx = maxVx;
		if (vx < -maxVx)
			vx = -maxVx;
		if (vy > maxVy)
			vy = maxVy;
		if (vy < -maxVy)
			vy = -maxVy;
	}

	// 通过对称角度来改变速度方向 用于处理板的碰撞
	public void changeVByAngle(double angle, double loss) {
		double vAngle = Math.atan(vy / vx) / Contents.PI * 180;
		if (vx > 0)
			vAngle += 180;
		double newAngle = (angle * 2 - vAngle) / 180.0 * Contents.PI;
		double v = Math.sqrt((vx * vx) + (vy * vy));
		changeV(v * Math.cos(newAngle), v * Math.sin(newAngle), loss);
	}

	//处理碰撞后的速度改变
	public void changeV(double vx, double vy, double loss) {
		this.vx = vx * loss;
		this.vy = vy * loss;
		correctV();
		changeNextPosition();
	}

	//获取下一单位时间后球的位置
	public void changeNextPosition() {
		nextX = x + Contents.DT * vx + 0.5 * ax * Contents.DT * Contents.DT;
		nextY = y + Contents.DT * vy + 0.5 * ay * Contents.DT * Contents.DT;
		changeNextEx();
		changeNextEy();
	}

	//计算球下一时刻的右下角坐标
	public void changeNextEx() {
		nextEx = nextX + size * Contents.LATTICE_SIZE * bx;
	}
	public void changeNextEy() {
		nextEy = nextY + size * Contents.LATTICE_SIZE * by;
	}

	//获取球的直径
	public double getDiameter() {
		return size * Contents.LATTICE_SIZE;
	}

	//获取球在x方向的速度
	public double getVx() {
		return vx;
	}

	//获取球在y方向上的速度
	public double getVy() {
		return vy;
	}

	//获取球下一时刻的x坐标
	public double getNextX() {
		return nextX;
	}

	//获取球下一时刻的y坐标
	public double getNextY() {
		return nextY;
	}

	//获取球下一时刻的右下角坐标
	public double getNextEx() {
		return nextEx;
	}
	public double getNextEy() {
		return nextEy;
	}

	//消除球
	public void clearBall() {
		haveBall = false;
	}

	//获取球的存在状态
	public boolean getHaveBall() {
		return haveBall;
	}

	public void setNextX(double X) {
		nextX=X;
		changeNextEx();
	}

	public void setNextY(double Y) {
		nextY=Y;
		changeNextEy();
	}
	//检验是否发生碰撞
	@Override
	public void isCollided(Ball b) {
		return;
	}



}
